#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char const *argv[])
{
    printf("父/main(%d)进程开始执行\n", getpid());

    int value = 100;

    // 创建一个子进程
    /*
        根据当前进程创建一个新的子进程， 子进程的内存空间是对父进程内存的一个拷贝
        内核会依次调度执行父进程和子进程（顺序不定）
        选择执行父进程：fork返回子进程的id，继续向下执行
        选择执行子进程：fork返回0，继续向下执行

        每个进程的内存保存一个程序计数器（PC）: 记录的是当前程序执行到的位置
     */
    pid_t pid = fork();
    if (pid < 0) // 创建失败
    {
        printf("创建子进程失败 \n");
    }
    else if (pid == 0) // 子进程
    {
        value++;
        printf("子进程(%d)开始执行, 父进程id=%d, value=%d\n", getpid(), getppid(), value);
    }
    else  // 父进程  pid为子进程的id
    { 
        value--;
        printf("父进程(%d)继续执行, 子进程id=%d, value=%d \n", getpid(), pid, value);
    }

    printf("进程(%d)即将退出 \n", getpid());

    return 0;
}
